/**
 * 
 * Opened Touchable RIA Framework - A Web RIA Javascript Framework
 * 
 * Copyright (c) 2012
 * Dual licensed under the MIT or GPL v2 licenses.
 * 
 * @author  CuTe_CuBe
 * @version $Id: context.js 8 2012-03-11 14:16:41Z cc.hgfeng@gmail.com $
 */

/**
 * 上下文管理对象
 * 在开发中不提倡使用全局变量，可通过本对象在全局或指定上下文中注册资源
 * 同时也提供了 exports 方法，把已注册的对象导出为全局变量
 * 
 */
OTR.Context = {
    
    /**
     * 管理的域
     */
    _scopes: {
        _default: {}
    },
    
    /**
     * 注册资源
     * 
     * @param string key
     * @param mixed  value
     * @param string scope
     */
    set: function(key, value, scope){
        if (undefined === scope) {
            scope = '_default';
        }
        
        if (!OTR.Util.isString(key) || !OTR.Util.isString(key)) {
            return this;
        }
        
        this._scopes[scope] = value;
        
        return this;
    },
    
    /**
     * 获取资源
     * 
     * @param string key
     * @param string scope
     */
    get: function(key, scope){
        if (undefined === scope) {
            scope = '_default';
        }
        
        return this._scopes[scope][key];
    },

    /**
     * 注销已注册的资源
     */
    unset: function(key, scope) {
        if (undefined === scope) {
            scope = '_default';
        }
        
        delete this._scopes[scope][key];
        
        return this;
    },
    
    /**
     * 检测指定键值的资源是否被注册
     * 
     * @param string key
     * @param string scope
     * @returns boolean
     */
    exists: function(key, scope) {
        if (undefined === scope) {
            scope = '_default';
        }
        
        return undefined !== this._scopes[scope][key];
    },
    
    /**
     * 创建一个新的上下文域
     * 
     * @return OTR.Context
     */
    createScope: function(scope) {
        if (undefined !== this._scopes[scope]
            || !OTR.Util.isString(scope))
        {
            return this;
        }
        
        this._scopes[scope] = {};
        
        return this;
    },
    
    /**
     * 注销域
     * 
     * @return OTR.Context
     */
    destroyScope: function(scope) {
        if (!OTR.Util.isString(scope)
            || undefined !== this._scopes[scope])
        {
            delete this._scopes[scope];
        }
        
        return this;
    },
    
    /**
     * 导出注册内容作为全局变量
     * 如果已存在同名的全局变量，将被覆盖
     * 返回导出变量的值
     * 
     * @param string key
     * @param string scope
     * @return mixed
     */
    exports: function (key, scope){
        window[key] = this.get(key, scope);
        
        return window[key];
    }
};